package io

import (
	"iter"

	M "github.com/IBM/fp-go/v2/monoid"
	"github.com/IBM/fp-go/v2/pair"
	"github.com/IBM/fp-go/v2/reader"
	S "github.com/IBM/fp-go/v2/semigroup"
)

type (

	// IO represents a synchronous computation that cannot fail
	// refer to [https://andywhite.xyz/posts/2021-01-27-rte-foundations/#ioltagt] for more details
	IO[A any]      = func() A
	Pair[L, R any] = pair.Pair[L, R]

	Kleisli[A, B any]  = reader.Reader[A, IO[B]]
	Operator[A, B any] = Kleisli[IO[A], B]
	Monoid[A any]      = M.Monoid[IO[A]]
	Semigroup[A any]   = S.Semigroup[IO[A]]

	Seq[T any] = iter.Seq[T]
)
